#include "../mq_server/message.h"
#include <gtest/gtest.h>
using namespace ns_message;

shared_ptr<MessageManage> mmp;

class MessageTest : public testing::Environment
{
public:
    virtual void SetUp() override
    {
        mmp = make_shared<MessageManage>("./test/File");
    }

    virtual void TearDown() override
    {
        // mmp->clear();
    }
};

// TEST(MessageTest, insert_test)
// {
//     mmp->init_msg_queue("q1");
//     mmp->init_msg_queue("q2");
//     mmp->init_msg_queue("q3");
//     ASSERT_EQ(mmp->qsize(), 3);

//     mmp->insert_msg("q1", nullptr, "111111", ns_proto::DeliverMode::UNDURABLE);
//     mmp->insert_msg("q1", nullptr, "好的", ns_proto::DeliverMode::DURABLE);
//     mmp->insert_msg("q1", nullptr, "aaaaaa", ns_proto::DeliverMode::UNDURABLE);
//     mmp->insert_msg("q2", nullptr, "bbbbbb", ns_proto::DeliverMode::DURABLE);
//     mmp->insert_msg("q2", nullptr, "很好", ns_proto::DeliverMode::DURABLE);
//     mmp->insert_msg("q2", nullptr, "prety good", ns_proto::DeliverMode::DURABLE);
//     mmp->insert_msg("q3", nullptr, "666666", ns_proto::DeliverMode::UNDURABLE);
//     mmp->insert_msg("q3", nullptr, "ceshi", ns_proto::DeliverMode::DURABLE);
//     mmp->insert_msg("q3", nullptr, "你好", ns_proto::DeliverMode::DURABLE);

//     ASSERT_EQ(mmp->_push_size("q1"), 3);
//     ASSERT_EQ(mmp->_push_size("q2"), 3);
//     ASSERT_EQ(mmp->_push_size("q3"), 3);
//     ASSERT_EQ(mmp->_presist_size("q1"), 1);
//     ASSERT_EQ(mmp->_presist_size("q2"), 3);
//     ASSERT_EQ(mmp->_presist_size("q3"), 2);
// }

TEST(MessageTest, recovery_test)
{
    mmp->init_msg_queue("q1");
    mmp->init_msg_queue("q2");
    mmp->init_msg_queue("q3");
    ASSERT_EQ(mmp->qsize(), 3);
    ASSERT_EQ(mmp->_comfirm_size("q2"), 0);
    ASSERT_EQ(mmp->_presist_size("q2"), 2);
    ASSERT_EQ(mmp->_push_size("q2"), 2);

    MessagePtr mp = mmp->front("q2");
    ASSERT_EQ(mmp->_comfirm_size("q2"), 1);
    ASSERT_EQ(mmp->_presist_size("q2"), 2);
    ASSERT_EQ(mmp->_push_size("q2"), 1);
    ASSERT_EQ(mp->payload().body(), "很好");

    mmp->comfirm_msg("q2", mp->payload().attributes().id());
    ASSERT_EQ(mmp->_comfirm_size("q2"), 0);
    ASSERT_EQ(mmp->_presist_size("q2"), 1);
    ASSERT_EQ(mmp->_push_size("q2"), 1);
}

// TEST(MessageTest, ack_test)
// {
//     MessagePtr mp = mmp->front("q2");
//     ASSERT_EQ(mp->payload().body(), "bbbbbb");
//     mmp->comfirm_msg("q2", mp->payload().attributes().id());
//     ASSERT_EQ(mmp->_comfirm_size("q2"), 0);
//     ASSERT_EQ(mmp->_presist_size("q2"), 2);
//     ASSERT_EQ(mmp->_push_size("q2"), 2);

//     shared_ptr<QueueMessage> qmp = mmp->qmp("q2");
//     qmp->_recovery();
//     ASSERT_EQ(qmp->_presist_total_size(), 2);
// }

// TEST(MessageTest, des_test)
// {
//     mmp->destroy_msg_queue("q3");
//     ASSERT_EQ(mmp->qsize(), 2);
// }

int main(int argc, char *argv[])
{
    testing::InitGoogleTest(&argc, argv);
    testing::AddGlobalTestEnvironment(new MessageTest);

    return RUN_ALL_TESTS();
}